// AfterOptimization.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>

// 粒子结构体
struct Particle {
    float x, y, z;    // 位置坐标
    float vx, vy, vz; // 速度
    // 其他属性
};

// 对象池类
class ParticlePool {
private:
    std::vector<Particle> pool;
    std::vector<Particle*> available;

public:
    ParticlePool(int size) {
        pool.reserve(size);
        for (int i = 0; i < size; ++i) {
            pool.emplace_back(Particle());
            available.push_back(&pool.back()); // 将地址放入可用列表
        }
    }

    Particle* allocate() {
        if (!available.empty()) {
            Particle* p = available.back();
            available.pop_back();
            return p;
        }
        return nullptr; // 池子满了
    }

    void free(Particle* p) {
        available.push_back(p);
    }
};

// 粒子容器
std::vector<Particle*> particles;

// 模拟函数
void simulate(int steps, ParticlePool& pool) {
    for (int step = 0; step < steps; ++step) {
        // 每个模拟步骤可能创建和销毁数千个粒子
        for (int i = 0; i < 1000; i++) {
            Particle* p = pool.allocate();
            if (p) {
                particles.push_back(p);
                // 初始化粒子属性（如果需要）
                p->x = p->y = p->z = 0.0f;
                p->vx = p->vy = p->vz = 0.0f;
            }
        }

        // 处理粒子逻辑（此处省略具体逻辑）

        // 假设我们在这里销毁一些粒子
        for (int i = 0; i < 500; i++) {
            pool.free(particles[i]);
            particles[i] = nullptr;
        }

        // 清理并整理容器
        particles.erase(std::remove(particles.begin(), particles.end(), nullptr), particles.end());
    }
}

int main() {
    const int simulationSteps = 1000;
    const int poolSize = 5000;

    // 初始化对象池
    ParticlePool pool(poolSize);

    // 记录开始时间
    auto start = std::chrono::high_resolution_clock::now();

    // 运行模拟
    simulate(simulationSteps, pool);

    // 记录结束时间
    auto end = std::chrono::high_resolution_clock::now();

    // 计算持续时间
    std::chrono::duration<double> duration = end - start;

    std::cout << "After Optimization (Using Object Pool):" << std::endl;
    std::cout << "Simulation of " << simulationSteps << " steps took " 
              << duration.count() << " seconds." << std::endl;

    // 可选：清理剩余粒子（根据具体实现可能不需要，因为对象池管理内存）
    particles.clear();

    return 0;
}
